{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {
   "name": "news_classification.ipynb",
   "provenance": [],
   "collapsed_sections": [],
   "include_colab_link": true
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "VDiJgruNUNez"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache D:\\TEMP1\\jieba.cache\n",
      "Loading model cost 1.241 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    }
   ],
   "source": [
    "import csv\n",
    "import os\n",
    "import jieba\n",
    "import re\n",
    "\n",
    "stopwords = [i.strip() for i in open('E:\\\\code\\\\Test\\\\data\\\\cn_stop_words.txt',\"r\", encoding=\"utf-8\").readlines()]\n",
    "\n",
    "def pretty_cut(sentence):\n",
    "    cut_list = jieba.lcut(''.join(re.findall('[\\u4e00-\\u9fa5]', sentence)), cut_all=True)\n",
    "    for i in range(len(cut_list) - 1, -1, -1):\n",
    "        if cut_list[i] in stopwords:\n",
    "            del cut_list[i]\n",
    "    return cut_list\n",
    "f = open (\"E:\\\\code\\\\Test\\\\data\\\\toutiao_cat_data.txt\", \"r\", encoding=\"utf-8\")\n",
    "lines = f.readlines()\n",
    "f.close()\n",
    "with open(os.path.join(\"E:\\\\code\\\\Test\\\\data\\\\news.csv\"), \"w\", encoding=\"utf-8\", newline='') as g:\n",
    "     writer = csv.writer(g)\n",
    "     writer.writerow([\"label\", \"news\"])\n",
    "     for line in lines:\n",
    "         x = line.strip(\" \")\n",
    "         x = line.strip(\"\\n\")\n",
    "         y = x.split(\"_!_\")\n",
    "         z = \" \".join(y)\n",
    "         cut_y = \" \".join(pretty_cut(z))\n",
    "         writer.writerow([y[2],cut_y])\n"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "df = pd.read_csv('E:\\\\code\\\\Test\\\\data\\\\news.csv', delimiter=\",\",names=['label','news'])#将逗号分隔值（csv）文件读取到DataFrame中\n",
    "print(\"数据总量: %d .\" % len(df))\n",
    "df.sample(10)#对数据集进行抽样查看"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 381
    },
    "id": "HuSx6ao3XcNJ",
    "outputId": "0521c42e-c564-427c-a54d-d6719e3b2ace"
   },
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据总量: 382689 .\n"
     ]
    },
    {
     "data": {
      "text/plain": "                label                                               news\n211205       news_edu  小学 英语 小升初 英语 英语单词 单词 词汇 汇总 收藏 下来 孩子 多记 记 小升初 初...\n311636       news_car                             电瓶 斤 水电 电瓶 跑 多公里 公里 电瓶\n328914  news_military  银河 银河帝国 帝国 放弃 克隆 克隆人 战士 之后 自然 自然人 机器 机器人 为主 主要...\n233765       news_edu  读错 错字 怕怕 读错 一辈 一辈子 辈子 不自 自知 多音字 诗经 邶 风 泉水 三国 三...\n201642   news_finance  股市 市里 永远 赚钱 一种 六张 醒脑 图 叫醒 股票 股票投资 投资 之路 底 仓 股价...\n322369      news_tech                                        联想 风暴 幕后 推手\n165171      news_tech                                        快递 不收 液体 发货\n344824       news_car  一张 图 读懂 考拉 拉比 拉比亚 比亚 比亚迪 凯迪拉克 拉克 北京 车展 考拉 拉奇 奇...\n282285       news_car               身边 买 款 车 感觉 非常 满意 店 行车 记录 记录仪 减速 减速带\n53373       news_tech  互联 互联网 联网 品牌 取名 拉 上个 动物 松鼠 土豆 土豆网 动物 动物园 豌豆 豌豆...",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>label</th>\n      <th>news</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>211205</th>\n      <td>news_edu</td>\n      <td>小学 英语 小升初 英语 英语单词 单词 词汇 汇总 收藏 下来 孩子 多记 记 小升初 初...</td>\n    </tr>\n    <tr>\n      <th>311636</th>\n      <td>news_car</td>\n      <td>电瓶 斤 水电 电瓶 跑 多公里 公里 电瓶</td>\n    </tr>\n    <tr>\n      <th>328914</th>\n      <td>news_military</td>\n      <td>银河 银河帝国 帝国 放弃 克隆 克隆人 战士 之后 自然 自然人 机器 机器人 为主 主要...</td>\n    </tr>\n    <tr>\n      <th>233765</th>\n      <td>news_edu</td>\n      <td>读错 错字 怕怕 读错 一辈 一辈子 辈子 不自 自知 多音字 诗经 邶 风 泉水 三国 三...</td>\n    </tr>\n    <tr>\n      <th>201642</th>\n      <td>news_finance</td>\n      <td>股市 市里 永远 赚钱 一种 六张 醒脑 图 叫醒 股票 股票投资 投资 之路 底 仓 股价...</td>\n    </tr>\n    <tr>\n      <th>322369</th>\n      <td>news_tech</td>\n      <td>联想 风暴 幕后 推手</td>\n    </tr>\n    <tr>\n      <th>165171</th>\n      <td>news_tech</td>\n      <td>快递 不收 液体 发货</td>\n    </tr>\n    <tr>\n      <th>344824</th>\n      <td>news_car</td>\n      <td>一张 图 读懂 考拉 拉比 拉比亚 比亚 比亚迪 凯迪拉克 拉克 北京 车展 考拉 拉奇 奇...</td>\n    </tr>\n    <tr>\n      <th>282285</th>\n      <td>news_car</td>\n      <td>身边 买 款 车 感觉 非常 满意 店 行车 记录 记录仪 减速 减速带</td>\n    </tr>\n    <tr>\n      <th>53373</th>\n      <td>news_tech</td>\n      <td>互联 互联网 联网 品牌 取名 拉 上个 动物 松鼠 土豆 土豆网 动物 动物园 豌豆 豌豆...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "print(\"在 labek 列中总共有 %d 个空值.\" % df['label'].isnull().sum())#查看label列的空值\n",
    "print(\"在 news 列中总共有 %d 个空值.\" % df['news'].isnull().sum())\n",
    "df[df.isnull().values==True]#isnull返回一个布尔数组\n",
    "df = df[pd.notnull(df['news'])]#保留非null的news\n"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1seMI_d0UOpn",
    "outputId": "08534084-6a76-4f11-fc49-993709751706"
   },
   "execution_count": 11,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "在 labek 列中总共有 0 个空值.\n",
      "在 news 列中总共有 52 个空值.\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "d = {'label':df['label'].value_counts().index, 'count': df['label'].value_counts()}#使用字典方法创建dataframe\n",
    "df_label = pd.DataFrame(data=d).reset_index(drop=True)#数据清洗时，会将带空值的行删除，此时DataFrame或Series类型的数据不再是连续的索引，可以使用reset_index()重置索引。\n",
    "print(df_label)\n"
   ],
   "metadata": {
    "id": "V9n8ZW1YXbEI",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "e66dbfc9-744c-471f-c44c-a28ba7065cdb"
   },
   "execution_count": 12,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                 label  count\n",
      "0            news_tech  41531\n",
      "1   news_entertainment  39395\n",
      "2          news_sports  37566\n",
      "3             news_car  35784\n",
      "4            news_game  29299\n",
      "5         news_culture  28031\n",
      "6         news_finance  27085\n",
      "7             news_edu  27025\n",
      "8           news_world  26909\n",
      "9        news_military  24983\n",
      "10         news_travel  21422\n",
      "11    news_agriculture  19321\n",
      "12          news_house  17672\n",
      "13          news_story   6273\n",
      "14               stock    340\n",
      "15               label      1\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    " \n",
    "label = [i for i in df_label[\"label\"]]\n",
    "count = [int(i) for i in df_label[\"count\"]]  \n",
    "labels = label[0:-1]\n",
    "count = count[0:-1]\n",
    "fig = plt.figure()\n",
    "plt.figure(figsize=(20,15),dpi=70)\n",
    "plt.bar(labels,count,0.9,color=\"green\")\n",
    "plt.xlabel(\"label\")\n",
    "plt.ylabel(\"count\")\n",
    "plt.show() \n"
   ],
   "metadata": {
    "id": "NIH4uNHdUwCH",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 873
    },
    "outputId": "8cb60a33-c282-4483-d8c9-eb8f262d3b37"
   },
   "execution_count": 13,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 0 Axes>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 1400x1050 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "df['label_id'] = df['label'].factorize()[0]\n",
    "label_id_df = df[['label', 'label_id']].drop_duplicates().sort_values('label_id').reset_index(drop=True)\n",
    "label_to_id = dict(label_id_df.values)\n",
    "id_to_label = dict(label_id_df[['label_id', 'label']].values)\n",
    "print(df.sample(10))\n"
   ],
   "metadata": {
    "id": "CFNRT4lkU9wk",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "abbfe15a-463e-4f68-bb06-a9bcdbdbe68e"
   },
   "execution_count": 14,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                   label                                               news  \\\n",
      "305274          news_car  月销量 销量 榜 车市 淡季 依旧 火炎 焱 途 观 弗 本田 宝 骏 传 祺 长安 宝 骏...   \n",
      "25930           news_edu     认为 师范 师范大学 大学 被评 评为 第七 七所 教育 教育部 直属 师范 师范大学 大学   \n",
      "38761       news_culture                                   老 北京 大门 门上 门环 讲究   \n",
      "154588          news_car  智能 汽车 卡 吉利 汽车 智能 驾驶 传统 车 企 一汽 财经 经国 国家 周刊 长安 长...   \n",
      "288888          news_car  车型 保值 率 高 买车 不要 错过 凯美瑞 日 系 车 汉 兰 达 丰田 保值 率 二手 ...   \n",
      "171466         news_game                              廖 化 能力 到底 关羽 战死 逃回 回去   \n",
      "246242      news_finance  金蜘蛛 蜘蛛 死 蜘蛛 赚钱 蜘蛛 遇到 可要 抓住 跑 均线 系统 股价 价金 金蜘蛛 蜘...   \n",
      "292096         news_tech  看完 有效 学习 明白 叫做 真正 学习 元认知 认知 经济 经济学 济学 微 电影 有效 ...   \n",
      "185432  news_agriculture  激活 乡村 活力 杭州 杭州市 州市 规划 规划局 百千 百千万 千万 蹲点 点出 出谋划策...   \n",
      "328710     news_military                                              历史 打仗   \n",
      "\n",
      "        label_id  \n",
      "305274         6  \n",
      "25930          7  \n",
      "38761          1  \n",
      "154588         6  \n",
      "288888         6  \n",
      "171466        13  \n",
      "246242         4  \n",
      "292096         8  \n",
      "185432        12  \n",
      "328710         9  \n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "from keras.preprocessing.text import Tokenizer\n",
    "\n",
    "MAX_NB_WORDS = 50000 # 设置最频繁使用的50000个词\n",
    "MAX_SEQUENCE_LENGTH = 250  # 每条cut_news最大的长度\n",
    "EMBEDDING_DIM = 100 # 设置Embeddingceng层的维度\n",
    "#num_words: 保留的最大词数，根据词频计算，保留前num_word - 1个\n",
    "tokenizer = Tokenizer(num_words=MAX_NB_WORDS, filters='!\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~', lower=True)\n",
    "tokenizer.fit_on_texts(df['news'].values)\n",
    "word_index = tokenizer.word_index\n",
    "print('共有 %s 个不相同的词语.' % len(word_index))\n",
    "\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "X = tokenizer.texts_to_sequences(df['news'].values)\n",
    "#经过上一步操作后，X为整数构成的两层嵌套list\n",
    "X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)\n",
    "#经过上步操作后，此时X变成了numpy.ndarray\n",
    "#多类标签的onehot展开\n",
    "Y = pd.get_dummies(df['label_id']).values\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "#拆分训练集和测试集，X为被划分样本的特征集，Y为被划分样本的标签\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.10, random_state = 42)\n",
    "\n",
    "import tensorflow as tf\n",
    "model = tf.keras.models.Sequential()\n",
    "model.add(tf.keras.layers.Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))\n",
    "model.add(tf.keras.layers.SpatialDropout1D(0.2))#dropout会随机独立地将部分元素置零，而SpatialDropout1D会随机地对某个特定的纬度全部置零\n",
    "model.add(tf.keras.layers.LSTM(100, dropout=0.2, recurrent_dropout=0.2))\n",
    "model.add(tf.keras.layers.Dense(16, activation='softmax'))#输出层包含15个分类的全连接层，激活函数设置为softmax\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "print(model.summary())\n"
   ],
   "metadata": {
    "id": "RUuqurTIVRIC",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "6721344d-0b4f-40cc-f078-6595ebaadc41"
   },
   "execution_count": 15,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "共有 144646 个不相同的词语.\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 250, 100)          5000000   \n",
      "_________________________________________________________________\n",
      "spatial_dropout1d (SpatialDr (None, 250, 100)          0         \n",
      "_________________________________________________________________\n",
      "lstm (LSTM)                  (None, 100)               80400     \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 16)                1616      \n",
      "=================================================================\n",
      "Total params: 5,082,016\n",
      "Trainable params: 5,082,016\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "from keras.callbacks import EarlyStopping\n",
    "epochs = 5\n",
    "batch_size = 64 #指定梯度下降时每个batch包含的样本数\n",
    "#callbacks（list），其中元素是keras.callbacks.Callback的对象。这个list的回调函数将在训练过程中的适当时机被调用\n",
    "#validation_split指定训练集中百分之十的数据作为验证集\n",
    "history = model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size,validation_split=0.1,\n",
    "                    callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])\n",
    "\n",
    "model.save(r'/content/drive/MyDrive/Colab Notebooks/model.h5')#保存模型\n"
   ],
   "metadata": {
    "id": "M2gZ9tLWVpN6",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "3a0760ea-95ca-4293-dbd3-f9d88d7edc4c"
   },
   "execution_count": 17,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "4843/4843 [==============================] - 5375s 1s/step - loss: 0.3863 - accuracy: 0.8891 - val_loss: 0.3580 - val_accuracy: 0.8953\n",
      "Epoch 2/5\n",
      "4843/4843 [==============================] - 5002s 1s/step - loss: 0.2660 - accuracy: 0.9206 - val_loss: 0.3528 - val_accuracy: 0.8983\n",
      "Epoch 3/5\n",
      "4843/4843 [==============================] - 4904s 1s/step - loss: 0.2061 - accuracy: 0.9371 - val_loss: 0.3739 - val_accuracy: 0.8964\n",
      "Epoch 4/5\n",
      "4843/4843 [==============================] - 4908s 1s/step - loss: 0.1656 - accuracy: 0.9487 - val_loss: 0.4027 - val_accuracy: 0.8963\n",
      "Epoch 5/5\n",
      "4843/4843 [==============================] - 4944s 1s/step - loss: 0.1351 - accuracy: 0.9575 - val_loss: 0.4414 - val_accuracy: 0.8921\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "def plot_graphs(history, string):\n",
    "    plt.plot(history.history[string])\n",
    "    plt.plot(history.history['val_' + string])\n",
    "    plt.xlabel(\"Epochs\")\n",
    "    plt.ylabel(string)\n",
    "    plt.legend([string, 'val_' + string])\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_graphs(history, \"accuracy\")\n",
    "plot_graphs(history, \"loss\")\n"
   ],
   "metadata": {
    "id": "KbRgI-QmVs7O",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 545
    },
    "outputId": "c61d91f2-0f51-4b05-c251-6a1db59fe9d2"
   },
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "#预测两条新闻\n",
    "def Predict(text):\n",
    "    txt = pretty_cut(text)\n",
    "    seq = tokenizer.texts_to_sequences(txt)\n",
    "    padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)\n",
    "    pred = model.predict(padded)\n",
    "    label_id= pred.argmax(axis=1)[0]\n",
    "    print(text + \" : \" + label_id_df[label_id_df.label_id==label_id]['label'].values[0])\n"
   ],
   "metadata": {
    "id": "6q0wQVBcVvH0"
   },
   "execution_count": 19,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "Predict(\"腾讯发布“00后画像报告” 颠覆我们对这一代的认知 00后,00后画像报告,腾讯,大数据,腾讯QQ\")\n",
    "#腾讯发布“00后画像报告” 颠覆我们对这一代的认知 00后,00后画像报告,腾讯,大数据,腾讯QQ : news_tech\n"
   ],
   "metadata": {
    "id": "j4N9obFEVw3X",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "2ebe18cb-5f0a-4d41-9e05-ff0e4e88e05f"
   },
   "execution_count": 20,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "腾讯发布“00后画像报告” 颠覆我们对这一代的认知 00后,00后画像报告,腾讯,大数据,腾讯QQ : news_tech\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "Predict(\"教师招聘重要考点备考之中国古代教育专题 有教无类,孔子,九品中正制,科举制,察举制\")\n",
    "#教师招聘重要考点备考之中国古代教育专题 有教无类,孔子,九品中正制,科举制,察举制 : news_edu\n",
    "\n"
   ],
   "metadata": {
    "id": "qGyMTxaGVzlY",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "2a5d7bb3-0c87-437f-fdb4-381e7b36cf13"
   },
   "execution_count": 21,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "教师招聘重要考点备考之中国古代教育专题 有教无类,孔子,九品中正制,科举制,察举制 : news_edu\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "#预测测试集\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import classification_report\n",
    "y_pred = model.predict(X_test)\n",
    "y_pred = np.argmax(y_pred, axis=1)\n",
    "Y_test=np.argmax(Y_test, axis=1)#将one-hot编码转换为整数\n",
    "print('accuracy %s' % accuracy_score(y_pred, Y_test))\n",
    "print(classification_report(Y_test, y_pred,target_names=[str(w) for w in labels]))\n"
   ],
   "metadata": {
    "id": "ZxdqJAcfGGAI",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "de98ff82-5ce9-4f35-d912-330de6ab538d"
   },
   "execution_count": 22,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy 0.8885375287476479\n",
      "                    precision    recall  f1-score   support\n",
      "\n",
      "         news_tech       0.87      0.89      0.88      2759\n",
      "news_entertainment       0.91      0.91      0.91      3938\n",
      "       news_sports       0.95      0.95      0.95      3765\n",
      "          news_car       0.84      0.79      0.81      2716\n",
      "         news_game       0.90      0.93      0.91      1782\n",
      "      news_culture       0.92      0.94      0.93      3514\n",
      "      news_finance       0.90      0.92      0.91      2615\n",
      "          news_edu       0.88      0.87      0.88      4248\n",
      "        news_world       0.88      0.88      0.88      2445\n",
      "     news_military       0.83      0.83      0.83      2191\n",
      "       news_travel       0.82      0.85      0.83      2706\n",
      "  news_agriculture       0.89      0.88      0.88      1957\n",
      "        news_house       0.90      0.93      0.92      2924\n",
      "        news_story       0.15      0.05      0.07        42\n",
      "             stock       0.80      0.78      0.79       662\n",
      "\n",
      "          accuracy                           0.89     38264\n",
      "         macro avg       0.83      0.83      0.83     38264\n",
      "      weighted avg       0.89      0.89      0.89     38264\n",
      "\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "Predict(\"交警查车也有“潜规则”，他们就爱拦这些车，几乎一查一个准 电动车,半挂车,交通法,改装车\")"
   ],
   "metadata": {
    "id": "PnjQmlCiuZTe",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "271ba896-67ec-46c1-8a0b-68615d85f9eb"
   },
   "execution_count": 23,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "交警查车也有“潜规则”，他们就爱拦这些车，几乎一查一个准 电动车,半挂车,交通法,改装车 : news_car\n"
     ]
    }
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ]
}